
package CCT220_Aula08_Exercicio01_13106;


import java.awt.GridLayout;

import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JTextArea;
import javax.swing.JTextField;


/**
 * Classificação e Busca
 * Utilizacao de um dos metodos de ordenação mais
 * simples, o metodo da bolha
 * 
 * @author marcel
 * 
 */
public class BuscaArray {

	private static final int TAM_ARRAY = 10;


	/**
	 * Metodo principal
	 * 
	 * @param args
	 */
	public static void main(String args[]) {

		/*
		 * variaveis locais
		 */
		JTextField[] jtf = new JTextField[TAM_ARRAY];
		JLabel[] jl = new JLabel[TAM_ARRAY];
		JPanel[] jc = new JPanel[TAM_ARRAY];

		int array[] = new int[TAM_ARRAY];
		int busca;

		JTextArea saidaArea = new JTextArea();
		String saida = new String();

		/* 1-Inicio da leitura dos dados */
		/*
		 * Montagem dos componentes para o
		 * JOptionPane
		 */
		for (int i = 0; i < TAM_ARRAY; i++) {

			jtf[i] = new JTextField("");
			jl[i] = new JLabel("Inteiro n " + (i + 1));
			jc[i] = new JPanel(new GridLayout(1, 2, 5, 5));
			jc[i].add(jl[i]);
			jc[i].add(jtf[i]);

		}
		/*
		 * Apresentando o JOptionPane com os
		 * componentes de leitura
		 */
		JOptionPane.showMessageDialog(null, jc,
		        "Programa de ordenação dos elementos de um array",
		        JOptionPane.INFORMATION_MESSAGE);
		/*
		 * Convertendo os dados inseridos pelo
		 * usuario para um array de inteiros
		 */
		for (int i = 0; i < TAM_ARRAY; i++) {
			/*
			 * Verifica se o valor de entrada dado
			 * pelo usuario e aceito, caso
			 * contrario completa com zero
			 */
			try {
				array[i] = Integer.parseInt(jtf[i].getText());
			} catch (Exception e) {
				array[i] = 0;
			}
		}

		/* 2-Preparando os dados de saida */
		saida = "Itens do array na ordem original\n";
		/*
		 * Acrescenta valores originais do array
		 * ao String saida
		 */
		for (int element : array) {
			saida += " " + element;
		}
		/* Ordenando o array */
		bubbleSort(array);
		saida += "\n\nItens do array em ordem ascendente\n";
		/*
		 * Acrescenta valores ordenados do array
		 * ao String saida
		 */
		for (int element : array) {
			saida += " " + element;
		}
		/*
		 * Configura o texto da saidaArea para a
		 * String saida
		 */
		saidaArea.setText(saida);
		/*
		 * Apresentando o JOptionPane com a area
		 * de texto saidaArea
		 */
		JOptionPane.showMessageDialog(null, saidaArea,
		        "Programa de ordenação dos elementos de um array",
		        JOptionPane.INFORMATION_MESSAGE);

		/* 3-Iniciando o processo de busca */
		busca = Integer.parseInt(JOptionPane.showInputDialog(null,
		        "Entre com um valor para a busca", "Busca por BuscaBinaria",
		        JOptionPane.INFORMATION_MESSAGE));
		JOptionPane
		        .showMessageDialog(
		                null,
		                (binarySearch(busca, array) != null ? ("Elemento \'"
		                        + busca + "\' encontrado na posicao \'"
		                        + binarySearch(busca, array) + "\' do vetor!")
		                        : ("Elemento \'" + busca + "\' nao encontrado no vetor!")),
		                "Programa de ordenação dos elementos de um array",
		                (binarySearch(busca, array) != null ? JOptionPane.INFORMATION_MESSAGE
		                        : JOptionPane.ERROR_MESSAGE));

		System.exit(0);
	}


	/**
	 * Metodo que executa o algoritmo de Busca
	 * Binaria num dado array
	 * 
	 * @param busca
	 * @param array
	 * @return -Valor da posicao onde busca se
	 *         encontra no array
	 *         -null caso nao encontre busca em
	 *         array
	 */
	private static Integer binarySearch(int busca, int[] array) {

		/*
		 * Variaveis locais
		 */
		int esq = 0;
		int dir = array.length - 1;
		int valorMeio;

		/* Algoritmo BuscaBinaria */
		while (esq <= dir) {
			valorMeio = esq + ((dir - esq) / 2);
			if (array[valorMeio] < busca) {
				/* Buscando */
				esq = valorMeio + 1;
			} else if (array[valorMeio] > busca) {
				/* Buscando */
				dir = valorMeio - 1;
			} else {
				/* Encontrou */
				return valorMeio;
			}
		}
		/* Nao encontrou */
		return null;
	}


	/**
	 * Metodo que ordena os elementos de um array
	 * considerando o algoritmo da Bolha
	 * 
	 * @param array2
	 */
	public static void bubbleSort(int array2[]) {

		/*
		 * Laço para controlar o número de
		 * passagens
		 */
		for (int passagem = 1; passagem < array2.length; passagem++) {
			/*
			 * laço para controlar o número de
			 * comparações
			 */
			for (int elemento = 0; elemento < array2.length - 1; elemento++) {
				/*
				 * compara elementos adjacentes e
				 * os troca de lugar se
				 * o primeiro elemento for maior
				 * que o segundo elemento
				 */
				if (array2[elemento] > array2[elemento + 1]) {
					troca(array2, elemento, elemento + 1);
				}
			}
		}
	}


	/**
	 * Troca dois elmentos de um array
	 * 
	 * @param array3
	 * @param prim
	 * @param sec
	 */
	public static void troca(int array3[], int prim, int sec) {

		/*
		 * Variavel local
		 */
		int elemento;
		/* Troca */
		elemento = array3[prim];
		array3[prim] = array3[sec];
		array3[sec] = elemento;
	}
} // fim da classe ClassificaArray
